package io.renren.modules.app.utils;

import it.sauronsoftware.jave.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 格式转换类 此类仅实现了部分音频格式的转换，如需更多格式转换，
 * 可参考JAVE官方文档：http://www.sauronsoftware.it/projects/jave/manual.php。
 * 或参考：http://blog.csdn.net/qllinhongyu/article/details/29817297
 *
 * @author liyuqi
 * @date 2017年1月11日
 */
public class AudioFormatConvertUtil {
    private static final Logger logger = LoggerFactory.getLogger(AudioFormatConvertUtil.class);
    // 科大讯飞语音合成APPID
    private static String KE_DA_XUN_FEI_APPID = "此处不提供，可自行去科大讯飞官网申请APPID";
    private static String PCM = ".pcm";
    private static String WAV = ".wav";
    private static String MP3 = ".mp3";
    private static String AMR = ".amr";
    // 文字转语音文件路径，仅写到文件名前缀，后面应补齐文件名及格式后缀
    private static String PATH = "/var/wechat/text/";
    /**
     * 发音人常量数组
     * 发音人  名称       属性     语言         参数名称
     *  小燕   青年女声   中英文   普通话       xiaoyan
     *  小研   青年女声   中英文   普通话       vixy
     *  小琪   青年女声   中英文   普通话       vixq
     *  小梅   青年女声   中英文   粤语         vixm
     *  小莉   青年女声   中英文   台湾普通话   vixl
     *  小宇   青年男声   中英文   普通话       xiaoyu
     *  小峰   青年男声   中英文   普通话       vixf
     */
    private static String[] VOICE_NAME = { "xiaoyan", "xiaoyu", "vixy", "vixq", "vixf", "vixm", "vixl" };

    /**
     * wav转amr，默认单声道。格式转换成功后立即删除源文件。
     * 注意：1、仅支持单声道wav文件转amr；2、除非特殊指定，否则比特率与采样率都不要修改，使用默认值即可！
     *
     * @author liyuqi
     * @date 2017年1月11日
     * @param source  源文件
     * @param target  转换后的文件
     * @param isDeleteSource  是否删除源文件，true 删除，false 保留
     * @param bitRate 音频比特率，默认12.2Kbit/s
     * @param samplingRate 采样率，默认8000Hz
     * @throws InputFormatException
     * @throws IllegalArgumentException
     */
    public static void wavToAmr(File source, File target, boolean isDeleteSource, Integer bitRate, Integer samplingRate)
            throws IllegalArgumentException, InputFormatException{
        AudioAttributes audio = new AudioAttributes();
//		audio.setCodec("libamr_nb");//该处经测试放开无法在linux执行成功，暂时注掉
        audio.setBitRate(bitRate == null ? 12200 : bitRate);
        audio.setSamplingRate(samplingRate == null ? 8000 : samplingRate);
        audio.setChannels(1);
        EncodingAttributes attrs = new EncodingAttributes();
        attrs.setFormat("amr");
        attrs.setAudioAttributes(audio);
        Encoder encoder = new Encoder();
        try {
            encoder.encode(source, target, attrs);
        } catch (EncoderException e) {
            e.printStackTrace();
        }
        System.out.println("****wav 转 amr转换成功****");
        if (isDeleteSource){
            source.delete();// 删除源文件
            System.out.println("******删除源成功******");
        }
    }

    /**
     * mp3转wav，格式转换成功后立即删除源文件
     *
     * @author liyuqi
     * @date 2017年1月11日
     * @param source 源文件
     * @param target 转换后得到的文件
     * @param isDeleteSource 是否删除源文件，true 删除，false 保留
     * @throws EncoderException
     * @throws InputFormatException
     * @throws IllegalArgumentException
     */
    public static void mp3ToWav(File source, File target, boolean isDeleteSource)
            throws IllegalArgumentException, InputFormatException, EncoderException{
        AudioAttributes audio = new AudioAttributes();
        audio.setCodec("pcm_s16le");
        EncodingAttributes attrs = new EncodingAttributes();
        attrs.setFormat("wav");
        attrs.setAudioAttributes(audio);
        Encoder encoder = new Encoder();
        encoder.encode(source, target, attrs);
        System.out.println("****mp3 转 wav转换成功****");
        if (isDeleteSource){
            source.delete();// 删除源文件
            System.out.println("******删除源成功******");
        }
    }

    /**
     * wav转mp3，格式转换成功后立即删除源文件
     *
     * @author liyuqi
     * @date 2017年1月11日
     * @param source 源文件
     * @param target 转换后得到的文件
     * @param isDeleteSource 是否删除源文件，true 删除，false 保留
     * @param bitRate 音频比特率，默认128kbit/s
     * @param channels 声道，默认双声道
     * @param samplingRate  采样率，默认44100Hz
     * @throws EncoderException
     * @throws InputFormatException
     * @throws IllegalArgumentException
     */
    public static void wavToMp3(File source, File target, boolean isDeleteSource, Integer bitRate, Integer channels,Integer samplingRate)
            throws IllegalArgumentException, InputFormatException, EncoderException{
        AudioAttributes audio = new AudioAttributes();
        audio.setCodec("libmp3lame");
        audio.setBitRate(bitRate == null ? 128000 : bitRate);
        audio.setChannels(channels == null ? 2 : channels);
        audio.setSamplingRate(samplingRate == null ? 44100 : samplingRate);
        EncodingAttributes attrs = new EncodingAttributes();
        attrs.setFormat("mp3");
        attrs.setAudioAttributes(audio);
        Encoder encoder = new Encoder();
        encoder.encode(source, target, attrs);
        System.out.println("****wav 转 mp3转换成功****");
        if (isDeleteSource){
            source.delete();// 删除源文件
            System.out.println("******删除源成功******");
        }
    }



    public static void main(String[] args) {
//        System.out.println(TextToAmrFile("中华人民共和国", "tem", 1, 100));
        File source = new File("/Users/liwentao/Desktop/test.wav");
        File tageart = new File("/Users/liwentao/Desktop/mp3.mp3");
        try {
            AudioFormatConvertUtil.wavToMp3(source,tageart, false, null,null,null);
        } catch (EncoderException e) {
            e.printStackTrace();
        }
    }
}
